package com.xm.queue.util;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;

import com.xm.queue.core.task.ITask;

/**
 * 任务队列
 * @author wang-xiaoming
 *
 */
public class TaskQueue {
	/**
	 * 任务队列
	 */
	private static final Queue<ITask> queues = new ConcurrentLinkedQueue<>();
	/**
	 * 任务计数
	 */
	private final AtomicInteger count = new AtomicInteger();
	
	/**
	 * 添加任务到任务队列
	 * @param task 当前任务
     */
	public synchronized void addTask(ITask task){
		while(count.get() > MyUtil.MAX_TASK){
			// 任务队列已满，等待一会
			try {
				System.out.println("超过最大任务量，等待唤醒，curr=" + count.get() + "，MAX_TASK=" + MyUtil.MAX_TASK);
				this.wait();
			} catch (InterruptedException e) {
				Thread.currentThread().interrupt();
			}
		}
		
		// 添加任务到任务队列
		queues.add(task);
		count.incrementAndGet();
		this.notifyAll();
	}
	
	/**
	 * 按照FIFO的规则获取一个任务
	 * @return 返回下一个任务
	 */
	public synchronized ITask nextTask(){
		ITask task;
		while (count.get() >= 1) {
			// 移除并返问队列头部的元素，如果队列为空，则返回null
			task = queues.poll();
			if(task != null){
				count.decrementAndGet();
				if(count.get() < MyUtil.MAX_TASK){
					System.out.println("当前任务计数小于最大任务量，正在唤醒，curr=" + count.get() + "，MAX_TASK=" + MyUtil.MAX_TASK);
					this.notifyAll();
				}
				return task;
			}
		}
		
		// 置零
		count.set(0);
		this.notifyAll();
		return null;
	}
	
	/**
	 * 判断当前任务队列是否为空
	 * @return true-空；false-非空
	 */
	@Deprecated
	public static synchronized boolean isEmptyQueues(){
		return queues.isEmpty();
	}
	
}
